package com.ktjiaoyu.controller;

import com.ktjiaoyu.entity.SysUser;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

/**
 * @return 13141
 * 2025/6/27
 * 15:17
 */
// 自定义第一个 SpringMVC 控制器

/**
 * 使用注解时，Controller类型也可以是普通类型
 * 但是需要标注@Controller注解
 */
@Controller
// 在类上定义@RequestMapping 相当于在路径中添加一层前缀（目录）
@RequestMapping("/dev")
public class HelloController {
    private static final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);
//    重写父类方法
//    @Override
//    protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
//        LOGGER.info("Spring MVC 框架搭建成功，当前请求路径：{}", request.getRequestURI());
//        // 返回逻辑视图名称，自动拼接前后缀获得真实视图路径
//        return new ModelAndView("hello");
//    }

    /**
     * 使用注解时，控制器方法是一个普通方法
     * 由@RequestMapping注解映射请求路径
     */
//    @RequestMapping("hello")
//    protected String hello(HttpServletRequest request) throws Exception {
//        LOGGER.info("使用注解模式实现控制器，请求路径：{}", request.getRequestURI());
//        // 返回字符串结果作为逻辑视图名
//        return "hello";
//    }
    // 定义入参参数
//    @RequestMapping("/hello")
//    protected String hello(@RequestParam(name = "realName", required = false) String name) throws Exception {
//        LOGGER.info("你好{}，欢迎你学习 SpringMVC!", name);
//        // 跳转到 /WEB-INF/jsp/hello.jsp
//        // 返回字符串结果作为逻辑视图名
//        return "hello";
//    }
    // 一个控制器类中可以定义多个控制方法
    @RequestMapping("welcome")
    protected String welcome(HttpServletRequest request) throws Exception {
        LOGGER.info("进入控制器 welcome 方法，请求路径是：{}", request.getRequestURI());
        return "hello";
    }

//    ModelAndVIew
    @RequestMapping("/hello")
    protected ModelAndView hello(@RequestParam(name = "realName", required = false)
                                 String name) throws Exception {
        LOGGER.info("你好{},欢迎学习SpringMVC!", name);
        ModelAndView modelAndView = new ModelAndView();
        // 添加对象到 Model 模型数据中，类似于 request.setAttribute()方法
        modelAndView.addObject("realName", name);
        // 设置逻辑视图名
        modelAndView.setViewName("hello");
        return modelAndView;
    }
//    model 使用 Map能得到相同效果
    @RequestMapping("/model")
    public String model(Model model, @RequestParam(name = "realName", required = false)
                        String name) throws Exception {
        LOGGER.info("你好{}, 在参数注入 Model 对象也可以出参！", name);
        // 使用 model 对象添加数据
        model.addAttribute("realName", name);
        // 创建 SysUser 对象，并存入 model对象
        SysUser sysUser = new SysUser();
        sysUser.setRealName(name);
        model.addAttribute("sysUser", sysUser);
        return "hello";
    }
}
